package org.lanqiao.tjut.entity;

import java.util.List;

import java.util.Scanner;

import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import org.lanqiao.tjut.db.DBDriverFactory;
import org.lanqiao.tjut.service.EduService;

public class Student {
	// 新建遍历打印集合类的实例对象
	Printlist pl = new Printlist();

	/**
	 * 学生登录验证
	 */
	public void entryStudent() {
		// 控制台显示要求学生输入账号密码
		Scanner input = new Scanner(System.in);
		System.out.println("请输入账号(学号)：");
		int inputStuid = input.nextInt();
		// 从数据库中获取该学生的密码
		String strSql = "SELECT STUPWORD FROM EDUSTUDENT WHERE STUID=?";
		String passwordNum = (String) DBDriverFactory.getDBDriverInstance().query(strSql, new ScalarHandler(),
				new Object[] { inputStuid });
		System.out.println("请输入密码：");
		String inputPassWord = input.next();
		// 将学生自己输入的密码与数据库中的密码比较，一致则进入学生功能菜单，不一致要求重新输入
		if (inputPassWord.equals(passwordNum)) {
			// 进入学生功能菜单
			logStudent(inputStuid);
		} else {
			System.out.println("账号或密码输入错误，请重新输入！");
			// 再次输入账号密码
			entryStudent();
		}
	}

	/**
	 * 学生功能菜单
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void logStudent(int inputStuid) {
		// 控制台显示要求教师输入账号密码
		EduService edu = new EduService();
		Scanner sc = new Scanner(System.in);
		System.out.println("***************************");
		System.out.println("*      1.查询个人信息");
		System.out.println("*      2.修改密码");
		System.out.println("*      3.查询同学信息");
		System.out.println("*      4.添加好友");
		System.out.println("*      5.显示我的所有好友信息");
		System.out.println("*      6.修改好友备注");
		System.out.println("*      7.删除好友");
		System.out.println("*      0.任意键返回主登录界面");
		System.out.println("***************************");
		System.out.println("请选择功能菜单：");
		int funNum = sc.nextInt();
		// 根据输入的不同的序号，进入不同的子功能
		switch (funNum) {
		case 1:
			// 查询个人信息
			selectInfo(inputStuid);
			break;
		case 2:
			// 修改密码
			updatePWord(inputStuid);
			break;
		case 3:
			// 查询同学信息
			queryStuMenu(inputStuid);
			break;
		case 4:
			// 添加好友
			addFriends1(inputStuid);
			break;
		case 5:
			// 显示所有好友信息
			allFriends(inputStuid);
			break;
		case 6:
			// 修改好友备注
			updeRename(inputStuid);
			break;
		case 7:
			// 删除好友
			deleFriends(inputStuid);
			break;
		case 0:
		default:
			// 返回主登录界面
			edu.Login();
			break;
		}
	}

	/**
	 * 1.查询个人信息
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void selectInfo(int inputStuid) {
		// 数据库操作语句 查询个人信息
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUID = ?";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler(),
				new Object[] { inputStuid });
		// 打印查询信息
		pl.printList(lst);
		// 返回上层菜单
		System.out.println("输入-1返回上层功能菜单");
		Scanner sc = new Scanner(System.in);
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回上层菜单--查询功能菜单
			logStudent(inputStuid);
		}
	}

	/**
	 * 2.修改密码
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void updatePWord(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		// 首先提示用户输入原始密码
		System.out.println("请输入您的原始密码：");
		String oldPassWord = sc.next();
		// 查询数据库中该学生的原始密码
		String strSql = "SELECT STUPWORD FROM EDUSTUDENT WHERE STUID=?";
		String passwordNum = (String) DBDriverFactory.getDBDriverInstance().query(strSql, new ScalarHandler(),
				new Object[] { inputStuid });
		// 将用户输入的原始密码与数据库中的对比，一致进入后续操作，不一致要求重新输入
		if (oldPassWord.equals(passwordNum)) {
			// 要求用户输入两次新密码
			System.out.println("请输入您的新密码：");
			String newPassWord1 = sc.next();
			System.out.println("请再次输入您的新密码：");
			String newPassWord2 = sc.next();
			// 对比用户输入的两次新密码，一致则修改成功，不一致则重新输入两次新密码
			if (newPassWord1.equals(newPassWord2)) {
				// 修改数据库中学生的密码
				String strSql1 = "UPDATE EDUSTUDENT SET STUPWORD='" + newPassWord1 + "' WHERE STUID=?";
				int i = DBDriverFactory.getDBDriverInstance().update(strSql1, new Object[] { inputStuid });
				if (i > 0) {
					System.out.println("密码修改成功！");
				} else {
					System.out.println("密码修改失败！");
				}
				// 返回上层菜单
				System.out.println("输入-1返回上层功能菜单");
				String strInput = sc.next();
				if (strInput.equals("-1")) {
					// 返回上层菜单--查询功能菜单
					logStudent(inputStuid);
				}
			} else {
				System.out.println("您两次输入新密码不一致，请重新输入！");
				updatePWord(inputStuid);
			}
		} else {
			System.out.println("您输入的原始密码不正确！请重新输入");
			updatePWord(inputStuid);
		}

	}

	/**
	 * 3.学生查询功能菜单
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void queryStuMenu(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		System.out.println("***1.查询所有学生信息****************");
		System.out.println("***2.根据指定编号(学号)查询单个学生信息**");
		System.out.println("***3.根据姓名模糊查询学生信息**********");
		System.out.println("***4.根据地址模糊查询学生信息**********");
		System.out.println("***5.根据年龄段查询学生信息************");
		System.out.println("***6.返回上层菜单*******************");
		int inIput = sc.nextInt();
		// 根据输入的不同的序号，执行相应的功能
		switch (inIput) {
		case 1:
			// 查询所有学生信息
			selectAllStu(inputStuid);
			break;
		case 2:
			// 根据指定编号(学号)查询单个学生信息
			selectOneStu(inputStuid);
			break;
		case 3:
			// 根据姓名模糊查询学生信息
			selectNameStu(inputStuid);
			break;
		case 4:
			// 根据地址模糊查询学生信息
			selectAdreStu(inputStuid);
			break;
		case 5:
			// 根据年龄段查询学生信息
			selectAgeStu(inputStuid);
			break;
		case 6:
			logStudent(inputStuid);
			break;
		default:
			System.out.println("输入错误，请重新输入！");
			queryStuMenu(inputStuid);
		}
	}

	/**
	 * 4.添加好友
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void addFriends1(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		// 从数据库中查询不是该学生的好友并显示出来
		String strSql1 = "SELECT STUID,STUNAME FROM EDUSTUDENT  WHERE STUID NOT IN((SELECT FRISTUID FROM EDUFRIEND,EDUSTUDENT  WHERE STUID=MYSTUID AND MYSTUID=?)) AND STUID!=? AND STUSTATE=0 ORDER BY STUID ";
		List lst1 = DBDriverFactory.getDBDriverInstance().query(strSql1, new MapListHandler(),
				new Object[] { inputStuid, inputStuid });
		System.out.println("以下同学不是您的好友：");
		// 打印数据库查询内容
		pl.printList(lst1);
		System.out.println("想加TA为好友，输入TA的学号：");
		// 输入想加好友的学号
		int inputID = sc.nextInt();
		// 将好友信息插入数据库中
		String strSql2 = "SELECT STUNAME FROM EDUSTUDENT WHERE STUID =?";
		String myName = (String) DBDriverFactory.getDBDriverInstance().query(strSql2, new ScalarHandler(),
				new Object[] { inputID });
		System.out.println("请给好友加个备注：");
		// 输入好友的备注
		String inputReName = sc.next();
		String strSql3 = "INSERT INTO EDUFRIEND VALUES (?,?,?,?)";
		int i = DBDriverFactory.getDBDriverInstance().update(strSql3,
				new Object[] { inputStuid, inputID, myName, inputReName });
		if (i > 0) {
			System.out.println("添加好友成功！");
		} else {
			System.out.println("添加好友失败！");
		}
		// 每添加完一次好友，就将该学生的好友信息显示出来
		String strSql4 = "SELECT FRISTUID,FRISTUNAME,FRISTURENM FROM EDUFRIEND WHERE MYSTUID=?";
		List lst2 = DBDriverFactory.getDBDriverInstance().query(strSql4, new MapListHandler(),
				new Object[] { inputStuid });
		// 打印数据库查询信息
		pl.printList(lst2);
		System.out.println("是否继续添加好友？(输入-1停止并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回学生功能菜单
			logStudent(inputStuid);
		} else {
			// 继续添加好友
			addFriends1(inputStuid);
		}
	}

	/**
	 * 5.我的所有好友信息
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void allFriends(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		System.out.println("您的好友信息如下：");
		// 从数据库中查询该好友的所有好友信息
		String strSql4 = "SELECT FRISTUID,FRISTUNAME,FRISTURENM FROM EDUFRIEND WHERE MYSTUID=?";
		List lst2 = DBDriverFactory.getDBDriverInstance().query(strSql4, new MapListHandler(),
				new Object[] { inputStuid });
		// 打印查询信息
		pl.printList(lst2);
		// 输入一个空行，显示更清晰
		System.out.println();
		System.out.println("输入-1停止并返回上层功能菜单");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回学生功能菜单
			logStudent(inputStuid);
		}
	}

	/**
	 * 6.修改好友备注
	 * 
	 * @param inputStuid
	 */
	public void updeRename(int inputStuid) {
		// 调用方法先显示该学生的所有好友信息
		allFriss(inputStuid);
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("输入要修改备注的好友学号：");
			int inpuNum = sc.nextInt();
			System.out.println("请输入TA的新备注：");
			String newReName = sc.next();
			// 从数据库中修改学生的备注
			String strSql = "UPDATE EDUFRIEND SET FRISTURENM ='" + newReName + "' WHERE FRISTUID=?";
			int i = DBDriverFactory.getDBDriverInstance().update(strSql, new Object[] { inpuNum });
			if (i > 0) {
				System.out.println("该学生信息修改成功！");
			} else {
				System.out.println("该学生信息修改失败！");
			}
			// 调用方法，显示删除后剩余好友的信息---
			allFriss(inputStuid);
			System.out.println("是否继续修改其他好友的备注？(输入-1停止修改并返回上层功能菜单，输入其他键继续)");
			String strInput = sc.next();
			if (strInput.equals("-1")) {
				// 返回学生功能菜单
				logStudent(inputStuid);
				break;
			}
		}
	}

	/**
	 * 7.删除好友
	 * 
	 * @param inputStuid
	 */
	public void deleFriends(int inputStuid) {
		// 调用方法先显示该学生的所有好友信息
		allFriss(inputStuid);
		while (true) {
			Scanner sc = new Scanner(System.in);
			System.out.println("输入要删除的好友学号：");
			int inpuNum = sc.nextInt();
			// 从数据库中删除好友
			String strSql = "DELETE FROM EDUFRIEND WHERE FRISTUID=?";
			int i = DBDriverFactory.getDBDriverInstance().update(strSql, new Object[] { inpuNum });
			if (i > 0) {
				System.out.println("该好友删除成功！");
			} else {
				System.out.println("该好友删除失败！");
			}
			// 调用方法，显示删除后剩余好友的信息---
			allFriss(inputStuid);
			System.out.println("是否继续删除其他学生的信息？(输入-1停止删除并返回上层功能菜单，输入其他键继续)");
			String strInput = sc.next();
			if (strInput.equals("-1")) {
				// 返回学生功能菜单
				logStudent(inputStuid);
				break;
			}
		}
	}

	/**
	 * 1.查询所有学生信息
	 */
	public void selectAllStu(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		// 该学生查询所有信息，不显示学生密码
		String strSql = "SELECT STUCODE,STUNAME,STUID,STUSEX,STUAGE,STUTELNUM,STUADDRESS,STUSTATE FROM EDUSTUDENT WHERE STUSTATE=0";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		// 打印查询信息
		pl.printList(lst);
		// 返回上层菜单
		System.out.println("输入-1返回上层功能菜单");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回查询学生功能菜单
			queryStuMenu(inputStuid);
		}
	}

	/**
	 * 2.根据学号查询一个同学信息
	 */
	public void selectOneStu(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入您想要查询的同学的学号：");
		// 输入同学的学号
		int inputId = sc.nextInt();
		// 数据库操作
		String strSql = "SELECT STUCODE,STUNAME,STUID,STUSEX,STUAGE,STUTELNUM,STUADDRESS,STUSTATE FROM EDUSTUDENT WHERE STUID=?";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler(), new Object[] { inputId });
		// 打印数据库查询信息
		pl.printList(lst);
		System.out.println("是否继续其他学生信息？(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回学生查询功能菜单
			queryStuMenu(inputStuid);
		} else {
			// 继续查询
			selectOneStu(inputStuid);
		}

	}

	/**
	 * 3.根据姓名模糊查询学生信息
	 */
	public void selectNameStu(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要姓名模糊查询的字：");
		String stName = sc.next();
		// 根据数据库操作语言格式化输入的学生姓名
		stName = "%" + stName + "%";
		// 数据库操作
		String strSql = "SELECT STUCODE,STUNAME,STUID,STUSEX,STUAGE,STUTELNUM,STUADDRESS,STUSTATE FROM EDUSTUDENT WHERE STUNAME LIKE '"
				+ stName + "' AND STUSTATE=0";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		// 打印数据库查询信息
		pl.printList(lst);
		System.out.println("是否继续根据姓名模糊查询学生信息？(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回学生查询功能
			queryStuMenu(inputStuid);
		} else {
			// 继续查询
			selectNameStu(inputStuid);
		}
	}

	/**
	 * 4.根据地址模糊查询学生信息
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void selectAdreStu(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要根据地址模糊查询的字：");
		String stAdress = sc.next();
		// 根据库语言格式化输入的信息
		stAdress = "%" + stAdress + "%";
		String strSql = "SELECT STUCODE,STUNAME,STUID,STUSEX,STUAGE,STUTELNUM,STUADDRESS,STUSTATE FROM EDUSTUDENT WHERE STUADDRESS LIKE '"
				+ stAdress + "' AND STUSTATE=0";
		// 数据库操作
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		// 打印数据库查询信息
		pl.printList(lst);
		System.out.println("是否继续根据地址模糊查询学生信息？(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回学生查询功能菜单
			queryStuMenu(inputStuid);
		} else {
			// 继续查询
			selectAdreStu(inputStuid);
		}
	}

	/**
	 * 5.根据年龄段模糊查询学生信息
	 * 
	 * @param inputStuid
	 *            学号
	 */
	public void selectAgeStu(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		// 输入模糊查询的年龄段
		System.out.println("请输入需要根据年龄段模糊查询的年龄段(较小的年龄)：");
		int stAge1 = sc.nextInt();
		System.out.println("请输入需要根据年龄段模糊查询的年龄段(较大的年龄)：");
		int stAge2 = sc.nextInt();
		// 进行数据库操作
		String strSql = "SELECT STUCODE,STUNAME,STUID,STUSEX,STUAGE,STUTELNUM,STUADDRESS,STUSTATE FROM EDUSTUDENT WHERE STUAGE >=? AND STUAGE<=? AND STUSTATE=0";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler(),
				new Object[] { stAge1, stAge2 });
		// 打印数据库信息
		pl.printList(lst);
		System.out.println("是否继续根据年龄段模糊查询学生信息?(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回学生查询功能菜单
			queryStuMenu(inputStuid);
		} else {
			// 继续查询
			selectAgeStu(inputStuid);
		}
	}

	/**
	 * 所有好友信息
	 * 
	 * @param inputStuid
	 */
	public void allFriss(int inputStuid) {
		Scanner sc = new Scanner(System.in);
		System.out.println("您的好友信息如下：");
		// 查询数据库操作
		String strSql4 = "SELECT FRISTUID,FRISTUNAME,FRISTURENM FROM EDUFRIEND WHERE MYSTUID=?";
		List lst2 = DBDriverFactory.getDBDriverInstance().query(strSql4, new MapListHandler(),
				new Object[] { inputStuid });
		// 打印数据库查询结果
		pl.printList(lst2);
	}
}
